package com.chenglu.android.common.base;

import android.app.Application;
import android.content.ClipboardManager;
import android.content.Context;
import android.widget.Toast;

import androidx.multidex.MultiDex;

import com.amap.api.location.AMapLocationClient;
import com.chenglu.android.BuildConfig;
import com.chenglu.android.bean.LoginBean;
import com.chenglu.android.common.manager.ActivityManage;
import com.chenglu.android.common.net.Dic;
import com.chenglu.android.common.utils.CacheUtils;
import com.chenglu.android.common.utils.LogUtils;
import com.chenglu.android.common.utils.SPUtils;
import com.chenglu.android.common.utils.ToastUtils;
import com.chenglu.android.common.utils.ValidUtils;
import com.chenglu.android.common.utils.toast.ToastInterceptor;
import com.chenglu.android.common.utils.toast.style.ToastBlackStyle;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.FormatStrategy;
import com.orhanobut.logger.LogcatLogStrategy;
import com.orhanobut.logger.Logger;
import com.orhanobut.logger.PrettyFormatStrategy;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;

import com.tencent.smtt.export.external.TbsCoreSettings;
import com.tencent.smtt.sdk.QbSdk;

import java.util.HashMap;

import io.reactivex.rxjava3.plugins.RxJavaPlugins;

/**
 * @author lyj
 * @Created by Copyright © 2023 Guangzhou Hongma Technology Co., Ltd. All rights reserved.
 * @Description：application
 */
public class BaseApplication extends Application {

    /**
     * 全局上下文
     */
    private static BaseApplication application;

    /**
     * Activity管理器
     */
    private ActivityManage activityManage;



    /**
     * 双数为默认取线上,单数则取本地测试服务器
     */
    private boolean isReleaseVersion;

    /**
      *
      * @description  全局设置
     *
      */
    private static ClipboardManager mClipboardManager;

    /**
     * 登录用户
     */
    private LoginBean.Data  user;

   //授权的token
    private String aaccessToken;
    //刷新的token
    private String refreshToken;

    private int currentTabPosition;
    @Override
    public void onCreate() {
        super.onCreate();


        activityManage = new ActivityManage();

        //初始化日志框架
        initLogger();

        SPUtils.init(this,"chengDeerMall");
        //初始化Toast
        initToast();

        //刷新框架
        initRefreshLayout();

        //初始化global
        Global.init(this);

        //抛出异常
        setRxJavaErrorHandler();

//        new AutoAdapterHelper().init(this) //防止方法数65535
//                .initForFragment(true);
          initX5();

          //全能工具类初始化
//        Utils.init(application);

//         XPopup.setAnimationDuration(200);
        initgaudMap();

    }


    /*高德隐私合规*/
    private void initgaudMap() {

        AMapLocationClient.updatePrivacyShow(this, true, true);
        AMapLocationClient.updatePrivacyAgree(this, true);
    }


//    public boolean isReleaseVersion() {
//        return isReleaseVersion;
//    }

    private void initX5() {

        QbSdk.initX5Environment(application, new QbSdk.PreInitCallback() {
            @Override
            public void onCoreInitFinished() {
                // 内核初始化完成，可能为系统内核，也可能为系统内核
            }

            /**
             * 预初始化结束
             * 由于X5内核体积较大，需要依赖网络动态下发，所以当内核不存在的时候，默认会回调false，此时将会使用系统内核代替
             * @param isX5 是否使用X5内核
             */
            @Override
            public void onViewInitFinished(boolean isX5) {

            }
        });

        //初始化操作
        HashMap map = new HashMap();
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
        QbSdk.initTbsSettings(map);
    }




    //初始化的时候添加的全局context
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        application = this;
        //初始化分包
        MultiDex.install(this);


    }

    public static ClipboardManager getClipboardManager(){
        if (mClipboardManager == null) {
            mClipboardManager = (ClipboardManager) application.getSystemService(Context.CLIPBOARD_SERVICE);
        }
        return mClipboardManager;
    }

    /**
      *
      * 防止异常
      *
      */
    private void setRxJavaErrorHandler() {
        RxJavaPlugins.setErrorHandler(throwable -> {
            throwable.printStackTrace();
            LogUtils.e("MyApplication", "MyApplication setRxJavaErrorHandler "  + throwable.getMessage());
        });
    }

    /**
     * 初始化日志打印框架
     */
    private void initLogger() {
        FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                //（可选）是否显示线程信息。 默认值为true
                .showThreadInfo(false)
                //（可选）要显示的方法行数。 默认2
                .methodCount(0)
                //（可选）设置调用堆栈的函数偏移值，0的话则从打印该Log的函数开始输出堆栈信息，默认是0
                .methodOffset(7)
                //（可选）更改要打印的日志策略。 默认LogCat
                .logStrategy(new LogcatLogStrategy())
                //（可选）每个日志的全局标记。 默认PRETTY_LOGGER
                .tag("APP_LOG")
                .build();

        Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy) {
            @Override
            public boolean isLoggable(int priority, String tag) {
                //非DEBUG模式下不打印LOG
                return BuildConfig.DEBUG;
            }
        });
    }

    /**
     * B
     * 初始化Toast
     */
    private void initToast() {
        ToastUtils.setToastInterceptor(new ToastInterceptor() {
            @Override
            public boolean intercept(Toast toast, CharSequence text) {
                boolean intercept = super.intercept(toast, text);
                if (intercept) {
                    Logger.e("空 Toast");
                } else {
                    Logger.d(text.toString());
                }
                return intercept;
            }
        });
        // 初始化吐司工具类
        ToastUtils.init(this, new ToastBlackStyle(this));
    }

    /**
     * 初始化刷新框架
     */
    private void initRefreshLayout() {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, layout) -> {
            //指定为经典Footer，默认是 BezierRadarHeader
            ClassicsHeader classicsHeader = new ClassicsHeader(context);
            classicsHeader.setFinishDuration(0);
            return classicsHeader;
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator((context, layout) -> {
            //指定为经典Footer，默认是 BallPulseFooter
            ClassicsFooter classicsFooter = new ClassicsFooter(context).setDrawableSize(20);
            classicsFooter.setFinishDuration(0);
            return classicsFooter;


        });
    }
    /**
     * 获取全局的上下文
     */

//   @Contract(pure = true)
    public static BaseApplication i() {
        return application;
    }

    /**
     * 获取Activity管理器
     *
     * @return ActivityManage
     */
    public ActivityManage getActivityManage() {
        if (activityManage == null) {
            activityManage = new ActivityManage();
        }
        return activityManage;
    }

    /**
     * 程序终止的时候执行
     */
    @Override
    public void onTerminate() {
        super.onTerminate();
        exitApp();
    }

    /**
     * 退出应用
     */
    public void exitApp() {
        activityManage.finishAll();
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(0);
    }

    /**
     * 退出登录清除换群
     */
    public void loginOutClean() {

    }

    /**
     * 保存用户信息
     *
     * @param user 登录用户
     */
//    public void setUser(LoginBean.Data  user) {
//        CacheUtils.get(this).put(Dic.LOGIN_USER_INFO, user);
//        this.user = user;
//    }
    /**
     * 获取用户信息
     *
     * @return User
     */
    public LoginBean.Data getUser() {
        //获取用户的id
        if (!ValidUtils.isValid(user) || !ValidUtils.isValid(user.getUser_id())) {
            //如果保存的user为空，则去本地缓存中取
            user = (LoginBean.Data) CacheUtils.get(this).getAsObject(Dic.LOGIN_USER_INFO);
        }
        if (!ValidUtils.isValid(user)) {
            //防止异常情况下getUser对象为null问题
            user = new LoginBean.Data();
        }
        return user;
    }

    /**
     * 是否登录
     *
     * @return boolean
     */
    public boolean isLogged() {
        LoginBean.Data user = getUser();
        return ValidUtils.isValid(user) && ValidUtils.isValid(user.getUser_id());
    }


    /**
      *
      * @description 保存和获取access_token
      *
      */

    public void setAaccessToken(String aaccesstoken) {
        aaccessToken=aaccesstoken;
    }

    public String getAaccessToken(){
        return aaccessToken;
    }

    /**
     *
     * @description 保存和获取refresh_token
     *
     */

    public void setRefreshToken(String refreshtoken) {
        refreshToken= refreshtoken;
    }

    public String getRefreshToken(){
        return refreshToken;
    }


    public String getDeviceId() {
        return "";
    }


    public int getCurrentTabPosition() {
        return currentTabPosition;
    }

    public void setCurrentTabPosition(int currentTabPosition) {
        this.currentTabPosition = currentTabPosition;
    }

    //获取登录的token
//    public String getLoginToken() {
//        return "";
//    }

}
